﻿package utils.core
{
	import flash.utils.Dictionary;
	/**
	 * ...
	 * @author zane
	 */
	dynamic public class HashMap extends Dictionary
	{
		
		/**	 
		 * 默认情况下，键使用弱引用，以便对象及时进行垃圾回收。
		 * 
		 * @param  指定对像是否弱引用。
		 */        	
		public function HashMap(useWeakReferences:Boolean = true)
		{
			super(useWeakReferences);
		}
		
		/**	 
		 * 增加一个键值到当前地图
		 * 
		 * @param 键
		 * @param 键指定值
		 */	
		public function put(key:*, value:*):void
		{
			this[key] = value;
		}
		
		/**	 
		 * 移除当前地图的一个键值
		 * 
		 * @param 要被移除的键名
		 * @return 返回移除掉的对象
		 */	
		public function remove(key:*):*
		{
			var tmp:*=this[key];
			this[key] = null;
			return tmp;
		}
		
		/**	 
		 * 检查指定键名是包含在当前地图中
		 * 
		 * @param  要检测的键名
		 * @return 如果包含返回True, 反之返回false
		 */	
		public function containsKey(key:*):Boolean
		{
			return this[key] != null
		}
		
		/**
		 * 确定地图中存在指定的值
		 * 
		 * @param  要确定的值	 
		 * @return 如果包含的有返回true,反之返回false.
		 */	
		public function containsValue(value:*):Boolean
		{
			for (var prop:* in this)
			{
				if (this[prop] == value)
				{
					return true
				}
			}
			return false;
		}
		
		/**	 
		 * 根据键值在当前地图中获取对应的键名
		 * 
		 * @param  要查找的键名对应的键值
		 * @return 要查找的键名
		 */	
		public function getKey(value:*):*
		{
			for (var prop:* in this) {
				if (this[prop] == value)
				{
					return prop
				}
			}
			return null;
		}
		
		/**
		 * 根据键名在当前地图中找到对应的键值。
		 *
		 * @param  键名
		 * @return 键名对应的键值
		 */
		public function getValue(key:*):*
		{
			if (this[key] != null)
			{
				return this[key];
			}
		}
		
		/**	 
		 * 获取当前地图的大小
		 * 
		 * @return 
		 */	
		public function size():int
		{
			var size:int = 0; 
			for (var prop:* in this) { 
				if (this[prop] != null)	
				{
					size++;	
				} 
			}
			return size;
		}
		
		
		/**	 
		 * 检测当前地图是否为空
		 * 
		 * @return 
		 */	
		public function isEmpty():Boolean
		{
			var size:int = 0;
			for (var prop:* in this)
			{ 
				if (this[prop] != null)
				{
					size++;	
				}
			}
			return size <= 0;
		}
		
		/**
		 * @author 卢业基
		 * @desc 获取所有的value
		 * @return Array
		 **/ 
		public function getValues():Array
		{
			var list:Array=[];
			for (var prop:* in this)
			{ 
				if (this[prop] != null)
				{
					list.push(this[prop]);
				}
			}	
			return list;
		}
		
		/**
		 * @author 卢业基
		 * @desc 获取所有的key
		 * @return Array
		 **/ 
		public function getKeys():Array
		{
			var list:Array=[];
			for (var prop:* in this)
			{ 
				list.push(prop);
			}	
			return list;
		}
		
		
		/**	 
		 * 清空当前地图
		 */	
		public function clear():void
		{
			for (var prop:* in this)
			{
				this[prop] = null;
			}
		}
		
	}

}